mod study_1;
mod conf;
mod pkg;
mod router;
mod middleware;

#[macro_use]
extern crate rbatis;
extern crate serde;
use actix_web::middleware::Logger;
use actix_web::{get, web, App, HttpServer};
use lazy_static::lazy_static;
use rbatis::rbatis::Rbatis;
use middleware::jwt::JWTMiddleware;


lazy_static! {
    // Rbatis是线程、协程安全的，运行时的方法是Send+Sync，无需担心线程竞争
    static ref RB:Rbatis=Rbatis::new();
}




// 这个结构体代表一个State
struct AppState {
    app_name: String,
}




//main 函数是不可以异步的 这里使用了宏attribute来让他可以进行异步的定义
#[actix_web::main]
async fn main() -> std::io::Result<()> {
    study_1::a::test_entry();



    // init app
    HttpServer::new(move||{
        App::new()
            .wrap(Logger::default())//中间件
            .wrap(JWTMiddleware::new())
            .data(AppState{                                               //应用程序状态(State)被同一作用域(Scope)内的所有路由和资源共享.State 能被 web::Data<T> 来访问，其中 T 是 state的类型. State也能被中间件访问.
                app_name: "dwb.ren".to_string()
            })
            // .service(
            //
                // web.scope("/auth")

                    // .configure(rout)

            // )
    })
        .bind("127.0.0.1:8080")?
        .run()
        .await



    // let scope_auth = Router::app_auth();
    // HttpServer::new(|| App::new().service(scope_auth))

}
